iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0

如果你今天想要在一個遞增陣列裡面尋找一個值你會怎麼做呢?

一格一格找嗎?這樣的最慘的時間複雜度是O(N)(也就是找到底才找到),其實還可以更快喔。

那就要用到今天提的這個東西,二分搜,他是一個神奇的作法可以幫你在遞增序列找到數字,而且時間複雜度只要O(log N)。

簡單來說做法就是,每次把資料分半,判斷我們的資料應該屬於哪一邊。

fun findN(a: Array<Int>,N: Int):Int{
    var start = 0
    var end = a.size-1
    var mid: Int
    while (start <= end) {
        mid = (end + start) / 2
        if (a[mid] < N) {
            start = mid + 1
        }
        else if (a[mid] > N){
            end =  mid - 1
        }
        else {
            return mid
        }
    }
    return -1
}

我們透過start跟end兩個變數來設定頭尾,然後透過中間那格判斷我們應該接著往哪查,直到找到我們的值。

一定要記得,二分搜的前提是已經要排序過的序列喔。


上一篇
[Day25][演算法]插入排序
下一篇
[Day27][演算法]dfs
系列文
櫛風風的「完全不會寫程式,從零開始的 Kotlin 教學」30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言